{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 2,
   "outputs": [],
   "source": [
    "# 引入包\n",
    "import numpy as np"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2025-09-02T07:15:38.076911400Z",
     "start_time": "2025-09-02T07:15:38.063153900Z"
    }
   },
   "id": "39a135171ace6022"
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "outputs": [],
   "source": [
    "file_name = './000001SZ.csv'"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2025-09-02T07:15:40.462588800Z",
     "start_time": "2025-09-02T07:15:40.433375600Z"
    }
   },
   "id": "58542c6501ebdfce"
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "\n",
      "[ 9.71 10.3   9.99  9.6   9.85  9.86  9.47 10.2  10.3  10.62 11.11 11.36\n",
      " 11.79 11.79 11.64 11.66 11.95 13.04 12.8  13.19]\n",
      "[ 340827.  635330.  611960.  392572.  604457.  415480. 1730708.  765325.\n",
      "  895014.  664370.  936335.  472975.  824456.  469410.  345713.  329749.\n",
      "  368640.  540952.  373428.  324698.]\n"
     ]
    }
   ],
   "source": [
    "# 读取文件\n",
    "# fname ：文件名\n",
    "# delimiter：分割符\n",
    "# unpack：是否解压\n",
    "# usecols：指定读取的列\n",
    "end_price, volume = np.loadtxt(fname=file_name, delimiter=',', unpack=True, usecols=(2, 6))\n",
    "print('\\n')\n",
    "print(end_price)\n",
    "print(volume)"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2025-09-01T03:41:10.111837700Z",
     "start_time": "2025-09-01T03:41:10.104404300Z"
    }
   },
   "id": "c337d213878fb03b"
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "\n",
      "max_price: 13.44\n",
      "min_price: 8.88\n"
     ]
    }
   ],
   "source": [
    "# 获取最大值和最小值\n",
    "max_price, min_price = np.loadtxt(fname=file_name, delimiter=',', unpack=True, usecols=(4, 5))\n",
    "print('\\n')\n",
    "print('max_price:', max_price.max())\n",
    "print('min_price:', min_price.min())"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2025-09-01T03:41:57.032876400Z",
     "start_time": "2025-09-01T03:41:56.994146300Z"
    }
   },
   "id": "880edfb4b85aeeaa"
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "一维数组极差 ： 8\n",
      "二维数组极差（纵向） ： [3 3 3]\n",
      "二维数组极差（横向） ： [4 4]\n"
     ]
    }
   ],
   "source": [
    " # 计算极差\n",
    "# np.ptp函数 ： 计算数组极差（Range）的函数，全称是\"peak to peak\"（峰峰值）。 它的作用是返回数组沿指定轴的最大值与最小值之差。\n",
    "arr = np.array([3, 1, 4, 1, 5, 9])\n",
    "print('一维数组极差 ：',np.ptp(arr))  # 输出：8 (9 - 1)\n",
    "\n",
    "arr_2d = np.array([[1, 5, 3], [4, 2, 6]])\n",
    "# 沿0轴（纵向）计算\n",
    "print('二维数组极差（纵向） ：',np.ptp(arr_2d, axis=0))  # 输出：[3 3 3] (4-1=3, 5-2=3, 6-3=3)\n",
    "\n",
    "# 沿1轴（横向）计算\n",
    "print('二维数组极差（横向） ：',np.ptp(arr_2d, axis=1))  # 输出：[4, 4] (5-1=4, 6-2=4)\n"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2025-09-01T03:45:00.021039100Z",
     "start_time": "2025-09-01T03:45:00.014381100Z"
    }
   },
   "id": "85c31dacd8b0881"
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "\n",
      "股价最高价极差： 3.8099999999999987\n",
      "股价最低价极差： 3.9399999999999995\n"
     ]
    }
   ],
   "source": [
    "# 股价极差\n",
    "# 股价近期最高价的最大与最小值的差值 或是 股价近期最低价的最大值与最小值的差值\n",
    "max_price, min_price = np.loadtxt(fname=file_name, delimiter=',', unpack=True, usecols=(4, 5))\n",
    "print('\\n')\n",
    "print('股价最高价极差：', np.ptp(max_price))\n",
    "print('股价最低价极差：', np.ptp(min_price))"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2025-09-01T03:46:07.125181900Z",
     "start_time": "2025-09-01T03:46:07.088123900Z"
    }
   },
   "id": "6434f5bf07ccf463"
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "平均价格 ： 11.0115\n",
      "成交量加权平均价格 ： 10.768422980338055\n"
     ]
    }
   ],
   "source": [
    "# 计算成交量加权平均价格\n",
    "# 成交量加权平均价格 ： VWAP(Volume Weighted Average Price), VWAP = (Price x Volume) / (Volume)\n",
    "end_price, volume = np.loadtxt(fname=file_name, delimiter=',', unpack=True, usecols=(2, 6))\n",
    "print('平均价格 ：', np.average(end_price))\n",
    "print('成交量加权平均价格 ：', np.average(end_price, weights=volume))"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2025-09-01T03:51:07.296209600Z",
     "start_time": "2025-09-01T03:51:07.288708900Z"
    }
   },
   "id": "777897c448534eea"
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "中位数 ： 10.864999999999998\n"
     ]
    }
   ],
   "source": [
    "# 中位数\n",
    "end_price, volume = np.loadtxt(fname=file_name, delimiter=',', unpack=True, usecols=(2, 6))\n",
    "print('中位数 ：', np.median(end_price))"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2025-09-01T03:51:47.904430800Z",
     "start_time": "2025-09-01T03:51:47.882680Z"
    }
   },
   "id": "38eb82831be87d4e"
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "方差 ： 1.3352127499999997 1.3352127499999997\n",
      "标准差 ： 1.1555140630905363 1.1555140630905363\n"
     ]
    }
   ],
   "source": [
    "# 方差 \n",
    "# 方差：就是偏差平方的平均值，描述数据离散程度\n",
    "# 标准差：方差的平方根，描述数据离散程度\n",
    "end_price, volume = np.loadtxt(fname=file_name, delimiter=',', unpack=True, usecols=(2, 6))\n",
    "print('方差 ：', np.var(end_price),end_price.var())\n",
    "print('标准差 ：', np.std(end_price),end_price.std())"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2025-09-01T03:53:22.191388600Z",
     "start_time": "2025-09-01T03:53:22.181130800Z"
    }
   },
   "id": "2f2b0e11cc05e619"
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "对数收益率的标准差 ： [ 0.05898761 -0.0305593  -0.03982149  0.02570836  0.00101471 -0.04035726\n",
      "  0.07425881  0.00975617  0.03059512  0.04510659  0.02225281  0.0371533\n",
      "  0.         -0.01280427  0.00171674  0.0245671   0.08729028 -0.01857639\n",
      "  0.0300138 ]\n",
      "年波动率 ： 34.45147972091315\n",
      "月波动率 ： 7.547941033030367\n"
     ]
    }
   ],
   "source": [
    "# 计算股票收益率、年波动率以及月波动率\n",
    "# 波动率是对价格变动的一种度量，历史波动率可以根据历史价格数据计算而来。计算历史波动率时，需要用到对数收益率。\n",
    "# 年波动率等于对数收益率的标准差除以其均值，再乘以交易日的平方根，通常交易日取250天\n",
    "# 月波动率等于对数收益率的标准差除以其均值，再乘以交易月的平方根，通常交易月取12月\n",
    "end_price, volume = np.loadtxt(fname=file_name, delimiter=',', unpack=True, usecols=(2, 6))\n",
    "# 对数收益率\n",
    "log_return = np.diff(np.log(end_price))\n",
    "# 年度波动率\n",
    "annual_volatility = np.std(log_return) / np.mean(log_return) * np.sqrt(250)\n",
    "# 月度波动率\n",
    "monthly_volatility = np.std(log_return) / np.mean(log_return) * np.sqrt(12)\n",
    "print('对数收益率 ：', log_return)\n",
    "print('年波动率 ：', annual_volatility)\n",
    "print('月波动率 ：', monthly_volatility)"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2025-09-01T06:27:56.025845900Z",
     "start_time": "2025-09-01T06:27:56.014843400Z"
    }
   },
   "id": "46841d4b81701cbb"
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "outputs": [],
   "source": [],
   "metadata": {
    "collapsed": false
   },
   "id": "a2b09976bf416c54"
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "outputs": [],
   "source": [
    "# 卷积\n",
    "# 卷积是一种在数学上表示两个函数（或信号）生成第三个函数的运算。这个新函数表示了其中一个函数如何被另一个函数“修改”或“加权平均”的效果。\n",
    "\n",
    "# 卷积在股票领域的应用主要集中在 量化分析、时间序列预测和异常检测 等方面，其核心优势在于能够提取数据的局部特征和时序模式。\n",
    "# 1. 特征提取与量化分析\n",
    "#   原理 ：在股票市场中，价格序列（如收盘价、成交量）是一个典型的一维时间序列。通过设计特定的 卷积核 （filter），可以自动从原始数据中提取出具有意义的局部特征。\n",
    "#   趋势识别 ：使用简单的线性卷积核（如 [1, 1, 1] 或 [1, 0, -1]）可以近似计算移动平均或价格斜率，从而识别出上升、下降或横盘趋势。\n",
    "#   模式识别 ：复杂的卷积神经网络（CNN）可以自动学习和识别K线图中的特定形态，如“头肩顶”、“双底”、“三角形整理”等技术分析图形，这些形态往往预示着价格的未来走向。\n",
    "#   多周期分析 ：可以使用不同尺度的卷积核来同时分析不同时间周期（如日线、周线、月线）的特征，实现多周期共振的分析。\n",
    "# 2. 时间序列预测\n",
    "#   原理 ：股票价格的未来走势在很大程度上依赖于其历史走势。卷积神经网络（特别是与长短时记忆网络LSTM或门控循环单元GRU结合的模型）可以有效地处理这种时序依赖关系。\n",
    "#   价格预测 ：将历史价格、成交量等数据组织成一个二维或三维张量（例如，一个时间步长为60的K线图矩阵），输入到CNN中，网络会自动学习其中的局部时序模式，并输出对未来若干个时间步长（如未来5天）的价格预测。\n",
    "#   波动率预测 ：预测市场的波动率（如ATR指标），帮助投资者进行风险管理。\n",
    "# 3. 异常检测与事件识别\n",
    "#   原理 ：卷积可以用于检测时间序列中的异常点或突变事件。通过比较预测值和实际值的差异，可以识别出市场中的 极端事件 或 非正常波动 。\n",
    "#   异常交易识别 ：卷积模型可以学习正常市场的价格波动模式，当检测到与模式严重偏离的交易时（如闪崩、闪涨），可以发出警报。\n",
    "#   事件驱动分析 ：当重大新闻（如财报发布、政策出台）发生时，价格序列会产生特定的特征。卷积网络可以学习这些特征，用于识别事件的影响范围和强度。"
   ],
   "metadata": {
    "collapsed": false
   },
   "id": "577282ff641f8557"
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "收盘价 ： [ 9.71 10.3   9.99  9.6   9.85  9.86  9.47 10.2  10.3  10.62 11.11 11.36\n",
      " 11.79 11.79 11.64 11.66 11.95 13.04 12.8  13.19]\n",
      "权重 ： [0.2 0.2 0.2 0.2 0.2]\n",
      "简单移动平均线 ： [ 9.89   9.92   9.754  9.796  9.936 10.09  10.34  10.718 11.036 11.334\n",
      " 11.538 11.648 11.766 12.016 12.218 12.528]\n"
     ]
    },
    {
     "data": {
      "text/plain": "<Figure size 640x480 with 1 Axes>",
      "image/png": "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"
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 简单移动平均线\n",
    "end_price = np.loadtxt(fname=file_name, delimiter=',', unpack=True, usecols=(2,))\n",
    "print('收盘价 ：', end_price)\n",
    "\n",
    "N = 5 # 移动窗口宽度,5日均线\n",
    "# 计算权重\n",
    "weights = np.ones(N) / N\n",
    "print('权重 ：', weights)\n",
    "sma = np.convolve( weights,end_price)[N-1:-N+1]\n",
    "print('简单移动平均线 ：', sma)\n",
    "import matplotlib.pyplot as plt\n",
    "plt.plot(sma,linewidth=2)\n",
    "plt.show()"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2025-09-02T02:16:17.503506800Z",
     "start_time": "2025-09-02T02:16:16.455124200Z"
    }
   },
   "id": "56e14d56b7fc55a7"
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "x : [0 1 2 3 4]\n",
      "y : [0 1 2 3 4 5 6 7 8 9]\n",
      "Exp x : [ 1.          2.71828183  7.3890561  20.08553692 54.59815003]\n",
      "Exp y : [1.00000000e+00 2.71828183e+00 7.38905610e+00 2.00855369e+01\n",
      " 5.45981500e+01 1.48413159e+02 4.03428793e+02 1.09663316e+03\n",
      " 2.98095799e+03 8.10308393e+03]\n",
      "linespace : [-1.   -0.75 -0.5  -0.25  0.  ]\n"
     ]
    }
   ],
   "source": [
    "# 指数衰减\n",
    "x = np.arange(5)\n",
    "y = np.arange(10)\n",
    "print(\"x :\", x)\n",
    "print(\"y :\", y)\n",
    "print(\"Exp x :\", np.exp(x))\n",
    "print(\"Exp y :\", np.exp(y))\n",
    "print(\"linespace :\", np.linspace(-1,0,5))"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2025-09-02T02:20:40.991273700Z",
     "start_time": "2025-09-02T02:20:40.982191Z"
    }
   },
   "id": "6e4ad6023a40e1d6"
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "收盘价 ： [ 9.71 10.3   9.99  9.6   9.85  9.86  9.47 10.2  10.3  10.62 11.11 11.36\n",
      " 11.79 11.79 11.64 11.66 11.95 13.04 12.8  13.19]\n",
      "权重 ： [0.11405072 0.14644403 0.18803785 0.24144538 0.31002201]\n",
      "指数移动平均线 ： [ 9.90496163  9.9774433   9.7911669   9.7586439   9.8835383   9.98088309\n",
      " 10.15778037 10.56868334 10.85473943 11.18223511 11.45825591 11.61989734\n",
      " 11.76100471 11.89533272 12.04044112 12.3309552 ]\n"
     ]
    },
    {
     "data": {
      "text/plain": "<Figure size 640x480 with 1 Axes>",
      "image/png": "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"
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 指数移动平均线\n",
    "end_price = np.loadtxt(fname=file_name, delimiter=',', unpack=True, usecols=(2,))\n",
    "print('收盘价 ：', end_price)\n",
    "\n",
    "N = 5 # 移动窗口宽度,5日均线\n",
    "weights = np.exp(np.linspace(-1.,0.,N))\n",
    "weights /= weights.sum()\n",
    "print('权重 ：', weights)\n",
    "ema = np.convolve( weights,end_price)[N-1:-N+1]\n",
    "print('指数移动平均线 ：', ema)\n",
    "import matplotlib.pyplot as plt\n",
    "t = np.arange(N-1,len(end_price))\n",
    "plt.plot(t,end_price[N-1:],lw=1,label='Original')\n",
    "plt.plot(t,ema,lw=2,label='EMA')\n",
    "plt.show()"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2025-09-02T02:25:06.460804Z",
     "start_time": "2025-09-02T02:25:06.388476700Z"
    }
   },
   "id": "ec2423d0f0190284"
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "outputs": [],
   "source": [
    "import pandas as pd"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2025-09-02T07:16:49.894640900Z",
     "start_time": "2025-09-02T07:16:49.849865300Z"
    }
   },
   "id": "20df1927d9c6be1e"
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "        stock       date  close   open   high    low   volume\n",
      "0   000001.SZ   2009/1/6  10.30   9.80  10.43   9.73   635330\n",
      "1   000001.SZ   2009/1/7   9.99  10.20  10.40   9.99   611960\n",
      "2   000001.SZ   2009/1/8   9.60   9.75   9.76   9.50   392572\n",
      "3   000001.SZ   2009/1/9   9.85   9.60   9.93   9.60   604457\n",
      "4   000001.SZ  2009/1/12   9.86   9.78  10.08   9.67   415480\n",
      "5   000001.SZ  2009/1/13   9.47   8.88   9.63   8.88  1730708\n",
      "6   000001.SZ  2009/1/14  10.20   9.30  10.25   9.30   765325\n",
      "7   000001.SZ  2009/1/15  10.30  10.01  10.60   9.97   895014\n",
      "8   000001.SZ  2009/1/16  10.62  10.34  10.94  10.34   664370\n",
      "9   000001.SZ  2009/1/19  11.11  10.65  11.35  10.65   936335\n",
      "10  000001.SZ  2009/1/20  11.36  11.07  11.40  11.02   472975\n",
      "11  000001.SZ  2009/1/21  11.79  11.15  12.20  11.00   824456\n",
      "12  000001.SZ  2009/1/22  11.79  11.80  12.00  11.40   469410\n",
      "13  000001.SZ  2009/1/23  11.64  11.58  11.93  11.58   345713\n",
      "14  000001.SZ   2009/2/2  11.66  11.76  11.99  11.51   329749\n",
      "15  000001.SZ   2009/2/3  11.95  11.66  12.06  11.60   368640\n",
      "16  000001.SZ   2009/2/4  13.04  12.02  13.15  12.02   540952\n",
      "17  000001.SZ   2009/2/5  12.80  13.07  13.20  12.63   373428\n",
      "18  000001.SZ   2009/2/6  13.19  12.82  13.44  12.82   324698\n",
      "日期 ： 0    2009-01-06\n",
      "1    2009-01-07\n",
      "2    2009-01-08\n",
      "3    2009-01-09\n",
      "4    2009-01-12\n",
      "5    2009-01-13\n",
      "6    2009-01-14\n",
      "7    2009-01-15\n",
      "8    2009-01-16\n",
      "9    2009-01-19\n",
      "10   2009-01-20\n",
      "11   2009-01-21\n",
      "12   2009-01-22\n",
      "13   2009-01-23\n",
      "14   2009-02-02\n",
      "15   2009-02-03\n",
      "16   2009-02-04\n",
      "17   2009-02-05\n",
      "18   2009-02-06\n",
      "Name: date, dtype: datetime64[ns]\n"
     ]
    }
   ],
   "source": [
    "df = pd.read_csv(file_name)\n",
    "df.columns = ['stock','date', 'close','open', 'high', 'low',  'volume']\n",
    "print(df)\n",
    "print('日期 ：', pd.to_datetime(df['date']))"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2025-09-02T07:19:17.116831900Z",
     "start_time": "2025-09-02T07:19:17.084531100Z"
    }
   },
   "id": "132600c8536c8195"
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "D:\\service\\python\\virtualenv\\fastapi\\lib\\site-packages\\IPython\\core\\pylabtools.py:152: UserWarning: Glyph 32929 (\\N{CJK UNIFIED IDEOGRAPH-80A1}) missing from font(s) DejaVu Sans.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "D:\\service\\python\\virtualenv\\fastapi\\lib\\site-packages\\IPython\\core\\pylabtools.py:152: UserWarning: Glyph 31080 (\\N{CJK UNIFIED IDEOGRAPH-7968}) missing from font(s) DejaVu Sans.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "D:\\service\\python\\virtualenv\\fastapi\\lib\\site-packages\\IPython\\core\\pylabtools.py:152: UserWarning: Glyph 20215 (\\N{CJK UNIFIED IDEOGRAPH-4EF7}) missing from font(s) DejaVu Sans.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "D:\\service\\python\\virtualenv\\fastapi\\lib\\site-packages\\IPython\\core\\pylabtools.py:152: UserWarning: Glyph 26684 (\\N{CJK UNIFIED IDEOGRAPH-683C}) missing from font(s) DejaVu Sans.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n"
     ]
    },
    {
     "data": {
      "text/plain": "<Figure size 640x480 with 1 Axes>",
      "image/png": "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XHzxxeE73/lOePnll7Mv8XT7+9//HsrZk08+mX0ZPfvss2HFihXZL7LJkyeHrVu3Fv25dFnfjRs37t7efPPNUClOOumkver+9NNPF9y3Uts19cILL+x1nGn7pi688MKqaNf0M5qel+mXSj433HBDuPnmm8OSJUvCc889l30xp+fwtm3bSnbel8OxfvDBB1ld58+fnz0uW7Ys+wNi2rRpJT0XyqVdU2nY2LPed999d9F/s1zbtSvHu+dxptsf/vCHLEx8/etfr7i27TFJFTn99NOTq6++evfznTt3JiNHjkyam5vz7j9jxozkvPPO2+u18ePHJ9/73veSSvLuu++ma7UkTz75ZMF9br/99qS+vj6pRNdee20ybty4Lu9fLe2a+sEPfpCMHTs22bVrV9W1a/qZve+++3Y/T49x+PDhyY033rj7tffffz+pq6tL7r777pKd9+VwrPk8//zz2X5vvvlmyc6FcjnWWbNmJdOnT+/Wv1MJ7drVtk2P/atf/WrRfa6tgLYtparp+dixY0d48cUXs27aPW9Slz5ftWpV3p9JX99z/1SarAvtX642b96cPQ4dOrTofrlcLowZMya7u+L06dPDa6+9FipF2vWednEec8wx4Vvf+lZ46623Cu5bLe2afqbvuuuucPnllxe9w3Mlt+ue1q1bFzZt2rRX26U3qUq72wu13YGc9+V8HqftPHjw4JKdC+XkiSeeyIaJTzjhhHDVVVeF//znPwX3raZ2feedd8JDDz2U9cTuz9oKbdsDUTXh47333gs7d+4MRx555F6vp8/TX2j5pK93Z/9ytGvXrjB79uzwxS9+MXzuc58ruF96wqddf/fff3/2hZb+3FlnnRX+/e9/h3KXfvmkcxsefvjhsHjx4uxL6ktf+lJ26+ZqbddUOo78/vvvZ+Pl1diuH9fZPt1puwM578tROqyUzgFJhwuL3fW0u+dCuUiHXO68887w2GOPhYULF2ZDx1OmTMnarprbNbV06dJsft4FF1xQdL/xFdq2B6pvb1eAg5PO/UjnMuxvbPDMM8/Mtk7pF9RnP/vZcOutt4brr78+lLP0l1Snz3/+89lJmv6lf++993bpr4lKddttt2XHnv4lVI3tyv+TztmaMWNGNtk2/dKpxnNh5syZu/87nWSb1n3s2LFZb8jZZ58dqln6x0Hai7G/ieBTKrRtQ633fBx++OHhE5/4RNbFtaf0+fDhw/P+TPp6d/YvN9///vfDgw8+GFpaWsKoUaO69bOHHnpoOOWUU0JbW1uoNGm39PHHH1+w7pXerql00uijjz4arrjiippp18726U7bHch5X47BI23vdHJxsV6PAzkXylU6rJC2XaF6V3q7dnrqqaeyicTdPY8ruW1rLnz069cvnHrqqVm3Xqe0Czp9vudfhntKX99z/1T6C6DQ/uUi/QspDR733XdfePzxx8PRRx/d7X8j7dJ89dVXs0saK006x+GNN94oWPdKbdc93X777dn4+HnnnVcz7Zp+jtMvlj3brqOjI7vqpVDbHch5X27BIx3nT4PmsGHDSn4ulKt0WDCd81Go3pXcrh/vvUyPI70yplbatsuSKnLPPfdkM+PvuOOO5B//+Edy5ZVXJoMHD042bdqUlV9yySXJT3/60937/+1vf0v69u2b/PrXv05ef/31bLbxoYcemrz66qtJObvqqquyKxyeeOKJZOPGjbu3Dz74YPc+Hz/W6667LnnkkUeSN954I3nxxReTmTNnJv37909ee+21pNz98Ic/zI513bp1WZtNmjQpOfzww7OrfKqpXfec1T969Ohk7ty5+5RVertu2bIlefnll7Mt/fVz0003Zf/deYXHr371q+ycvf/++5NXXnklu0rg6KOPTj788MPd/0Z61cDvfve7Lp/35XisO3bsSKZNm5aMGjUqaW1t3es83r59e8Fj3d+5UI7Hmpb96Ec/SlatWpXV+9FHH02+8IUvJMcdd1yybdu2imvXrnyOU5s3b04++clPJosXL877b3y1Qtq2p1RV+EiljZn+4u7Xr192qdazzz67u+wrX/lKdsnXnu69997k+OOPz/Y/6aSTkoceeigpd+mHPd+WXnZZ6Fhnz569+/+XI488Mvna176WvPTSS0kluOiii5IRI0ZkdT/qqKOy521tbVXXrp3SMJG255o1a/Ypq/R2bWlpyfvZ7Tym9HLb+fPnZ8eSfvGcffbZ+/z/MGbMmCxQdvW8L8djTb9gCp3H6c8VOtb9nQvleKzpH0WTJ09OjjjiiOyPgPSYvvvd7+4TIiqlXbvyOU7deuutyYABA7LLxfMZUyFt21P6pP/T9X4SAICDUzVzPgCAyiB8AABRCR8AQFTCBwAQlfABAEQlfAAAUQkfAEBUwgcAEJXwAQBEJXwAAFEJHwBAiOn/AEk6J3G6d0ZFAAAAAElFTkSuQmCC"
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# K线图\n",
    "from mplfinance.original_flavor import candlestick2_ohlc\n",
    "import matplotlib.pyplot as plt\n",
    "import mplfinance as mpl\n",
    "df = pd.read_csv(file_name)\n",
    "df.columns = ['stock','date', 'close','open', 'high', 'low',  'volume']\n",
    "fig = plt.figure()\n",
    "axes = fig.add_subplot(1,1,1)\n",
    "candlestick2_ohlc(axes, opens=df['open'], \n",
    "                  closes=df['close'], \n",
    "                  lows=df['low'],\n",
    "                  highs=df['high'], \n",
    "                  width=0.6, colorup='red', colordown='green')\n",
    "# plt.xticks(range(len(df.index.values)),df.index.values,rotation=30)\n",
    "# axes.grid(True)\n",
    "plt.title('股票价格')\n",
    "plt.show()"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2025-09-02T08:04:45.310295700Z",
     "start_time": "2025-09-02T08:04:44.950699900Z"
    }
   },
   "id": "c2bb8b2498323282"
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "outputs": [
    {
     "data": {
      "text/plain": "<Figure size 800x575 with 4 Axes>",
      "image/png": "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6dixY7n3r1y5Urp3725WfanNsFiePn36SOvWrU1oDLRlMTk52ZxW91esSPmWMHfuXOnfv7/ExHj3A9+tdThl/Eey9PHA+/JWRa+735fFD50vbuHWY6GyqIMPdfChDj5er0NOTo40bdq0wrBY5dPQ2jfx66+/dgyLep/OyxgKJ554oixcuNDxfl2yUC8H0wPFLQeLm15LdbivDlFB2Ya7aubWY6FqqIMPdfChDt6uQ0yAr7nKYVGX97vuuuvMFDdnn312STDUPou6ZvTLL78skyZNklDQ9aqTkpJCsm0AAAA3qXJYvPHGG03T5dNPPy0vvviiFBcXm9t1vsWePXvK66+/LsOGDav08+7evVvWrl1b8vP69etN+GvSpIk5tTxu3DjZvHmzvPHGG+b+Z555Ro455hjp3Lmz7Nu3z/RZ/PzzzyUjI6OqLw0AAAA1MXXO8OHDzUXP+dtL/2mArE5T7tKlS8tMsq3rTqsRI0aYAKqTbW/YsKHk/oKCAhk7dqwJkDo45fjjj5fPPvus3Im6AQAAEMSwaNNwWFOnffv27WtGUzvRwFjaXXfdZS4AAACoeXWklmzcuNGswgIAAIDIVWthcceOHTJ9+vTaenoAAACE82no2bNn+73/l19+qepTAwAAINLDok6UrZNm++tfePDKLgAAAPDIaWgd0PL+++/L/v37y7189913NbunAAAAiJywqHMp6oTcTipqdQQAAICLT0PfeeedsmfPHsf727ZtK1988UVVnx4AAACRHBZPP/10v/c3bNhQ+vTpU9WnBwAAgJunzgEAAEDkIywCAADAEWERAAAAjgiLAAAAcERYBAAAgCPCIgAAABwRFgEAAOCIsAgAAABHhEUAAADUblhcsGCBpKamyimnnCKbN282t7355puycOHCmnh6AAAARGpYfO+992TgwIFSv359WbZsmeTn55vbd+3aJY8++mhN7CMAAAAiNSw+/PDDMmXKFHn55ZclJiam5PbTTjtNvvvuu+o+PQAAACI5LK5atUrOOOOMQ25v3LixZGdnV/fpAQAAEMlhsUWLFrJ27dpDbtf+iscee2yln2/+/PkyePBgadmypURFRcmsWbMq/J0vv/xSevToIXFxcdK2bVt5/fXXK71dAAAA1EJYHDVqlNx6662yZMkSE+62bNkib731ltxxxx1yww03VPr59uzZI127dpUX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O3a0vv32W8tL/va3v1kJCQnWe++9Z2qgHwxt2rSxVq5caXnF3r17rYsvvth66qmnzM+//PKL9eabb1r333+/tWTJEmvbtm2WFyxevNg67LDDrH/84x/mfeG7776zLrroIis+Pt56++23rYKCAssrfxONGjUyx8Dy5cutl156yTr55JPN+6TXrF692mrZsqV13333mb8TbUw4//zzrSeeeMLymsmTJ1vDhw83/9bPjClTpli33367NXXqVE99brCCi0ds27ZNTjnlFHn33XelYcOGMnToUGnQoIH8/vvvkpubKw8++KCMGDFCEhMTxc30lOs777wjH374odSrV8+cUunVq5f06dPHnH666qqrzL+bNGkibrV+/Xrz//9///d/Mnr0aHPbnj175KyzzpLzzz9ftm/fLn/605+kR48eEh0dLW6lp5P0Neqppfbt20u/fv2kZcuWkpWVZe7T7hp6+u2YY44RN/v444/l3nvvlS+++KLMcX/99dfLm2++Ke+9956cc845pnuCW09N69/ElVdeKZdeeqnccsst5raCggLznnn66afLM888I16hXRD0uNfTr5MnT5bY2Fhzu9ZGPzP0/r59+8qAAQPk2GOPFbfTz8U6deqY7ir6uvft22c+Q7X7kr5v3HDDDXLxxReL29Fn0SP0jS8+Pt70wdA3Pg0Fn3zyiWzatEluvfVWExYXLVpkHuvm7w8ahP7zn/+YQJCTkyOXXHKJCdL6mvVNUT8wZs+e7eo6aPi5//77TR8c27Bhw2TDhg3yww8/mE7c+gE5b948V9dBg/BRRx0leXl5pl/W4MGDzf+9fgikpaWZEKV9W91cA7Vz507zRUmDgP1eoaZMmWI+BK+++uqS/qxupX0TO3XqJCeeeKL5Wd8n9f2gf//+5vhQpfvyuvl40DWSR40aJZdddllJUHz44YdNP3elDQpjxoyRp556yvW1UMcdd5wJi9rfPyYmRj744APz3vjRRx+Zz1RtfNAv264X6qZNBM8555xjdejQwTrzzDPNadjSLr30UuuMM86w3G7Xrl2m/03Dhg1NXz3tr/jbb7+V3H/ttdea07F5eXmWm/sjlfb6669bffr0MX1z9DSL0lNOp556quv7sl555ZWmX1bfvn3NacjSbrzxRtNvza6JW+3evdvq0qWLdfnll5ccH3a3lD/++MPq3LmzNWnSJPOzW48H7Yump55t9uucMGGCdcUVV5R5rNu67JT3nlC6Bto15bzzzjOfGfZjta9vVFSUtWbNGsvtdXj//fdNX3/93LzuuuvK3Pf555+bOixbtsxyO1oWXUpbiTZv3mwuNm091NaDL7/8suT0on6jVl26dJEWLVqI2+uQkJBgWlB1FPDw4cNl0KBB0rp165Jvhl27djU/u1V5U8NoDbTVoE2bNiWtR8nJyabVza3TRNgj3ydOnGhe91dffXXIKEc9FrQV1m2n4v/44w/ZsWOH6YKitLXkpptuktWrV8u4ceNKWtn1WltO9JRbdna2eaybjge7DnqWQd8Xjz/+eHO7vm77dWoXnd27d5f8jp56tU9Tu2m075YtW8wZlzlz5pS8XrsG+vehp2D1fcLWuHFj0+Km126tg/7fqwsvvFBuu+0287mpo8P1TJStbdu20rNnT9Olye0Iiy6kf9ja/+qMM86Qzp07ywMPPGA+CE444QTzRpeUlCS33367/PrrryYs6pvj4sWL5fDDDxc312HChAlmCgTVrVs3c/pNT7sq/UDUOuiphVatWkn9+vXFLd5++215/vnnHe9v1qxZSV9V/YDQ0256WrJDhw7i1hrYoVm/IN13333meNDpg/QDQUOU9st6//33Xdd3VU+ZadcLuy+efihqMNQvThqE9PSa9sGyjwUNkhqWNTS6tQ76/qBTBtnTwpQOxI0aNTLvDWrgwIHmy+dzzz0nbqCvVf8O9D1QT79r/2UNhHocPPbYYyWnl/ULZNOmTcv83ej0Svo5oqes3VoH/f9+9NFHzf3p6emmj7f+fWg/Tv0c0QaGqVOnmu5MbvvsLFeomzZRs+bMmWNG9On0OF988YUZsaVTYlx44YVmKgw1a9Ysc9pJp4/R0X69evUy00XYp9vccKrJqQ46+nXu3LnmMTrqs23btlbv3r3N6SY9FdmtWzdX1eGDDz4wp0n08pe//MXvY3XU65YtW8wpp+7du7vm9KtTDezTTjo9zNKlS62zzjrLjArWY6JHjx5W165dS0YCu+FYeOONN6wGDRqY0Zw6RYyeZm/SpIn1888/m/uzs7OtJ5980px2Pvroo81p6RNPPNFML+WWY8FfHVatWnXIY7UeOhJW/ya0e4p9PLilHjplmHa1uOOOO6zNmzeb0fCjRo2yTjjhBOuaa6455LjPysqyxo8fbzVu3NhasWKF5RZOddDPRu2atP9AHdLS0syxolMr6Xukfqbo54gXEBZdRg/mgQMHlrntyy+/NG/6Oq+g3S9Hp0N49tlnrccff9xMDWC/+bllXjV/dRg6dKiZ8kBf6+zZs60BAwaY/pz/93//V1IHN3wY6JRI5557rjV27FjzoVenTh3HqS/09eqXiNNPP9306bQ/FCP9eKioBgf3U5o5c6b16quvmkBhv3Y3HAvap0q/EOqXp9K10SCoYdqmcwpqaNJ63XLLLda9997rqveGQOtgu+eee8yXDA0GbguK6qeffjIh+Icffii5TafS0i9V+sVZjwGbvmdqo4M+3m199PzVQb803nLLLSWBUcPhxx9/bP3zn/80odIrCIsu88ADD5iBCfqGph+E9ofh/Pnzrfbt25tv0U7c8GEQaB00GJZWeuJdt9RBB+7YcwbqG51+OXAKjFofbWHSyZndFJgDqYHe7tS53S3HgnbE10FMB7ee6SCviRMnVvj/7YZjIdA6lD4WdO5JHeDipr+J0n799VczIb8u2KDsQJSbm2s98sgjpmVNv1Dbt+mckzofqdtUVIeePXuW+2XCSwiLLqN/2PpNOCMjo+TNzT7wdVSXflB+/fXXltsFUgcNEAdzw+nG0nQ0q81uTdbXri3KpUeI6+klN4akQGugKxq5uZVAP/RKH+92K5mO8PTSRMuVrYPOimC/J7gtKNrHvXa/0LMtB09Cr7XS7hh6GtbtAqnDqFGjLC9jgIvL6Fxx1157rem8rWubauf0oqIic5/OGaajO3Wwi9sFUgedT+9gbhrtqeyO6UpH7GnnbZ0fTUe9Tpo0yUwwO2TIEJk+fXqZ33PTnHqB1ECPFx304FY6UMOeQ1AbCez/Xx2goK/fvl2PhU8//VTcqjJ10HlodaCbPfDFbaPi7dHuf/nLX+Rf//qXGQhpjwC2a3XeeefJ2rVrS2bNcKNA67BmzZqSzxAvctfRD+Puu+8200KceeaZZmLhU0891dyuf/D6huemkb7+UIdD6YeijnbVD0mdWFfDkgYo/bfXa6AzBHiBhh/7S5HWwJ5GSD8Q9YvV2WefLV5QUR30S2Xpx7qNviadaFxnAtBVevSL9d69e+Wee+4pmQlBV7bRGQPKm3LLi3WIcuFxECiW+3OpVatWyUMPPWSmDNE51HR+wW+++Ua2bt0q3333natajvyhDuX77bffzLQhOoeaLvNmt7y6rfXEHy/XwF66T1dyOvnkkyUzM9P8Xfz0009muhzq4K06KJ1rVIOSBiR97To1ji6LqvPS6pyKXkEdykdYdDH9r502bZr5tqTfmo888kj561//av4A3LzO68GoQ1k6P5gu76cfjNolwUshyeb1GtjzCWormp560wnIv/76a88FJOpQtg466bTONbts2TJp3ry5Wf5Ul0H0CurgjLAYoTPNH+zgyWRL0744pWeYd8ObIHWoeh10xYo333zTnIJ1Q0iiBlWvg64RrhNz66T81MFddVAHBrGaethrftvrPR9ck4Pr5q9ekYY6VB9hMYKUPmh1FQFtEdEDX0+z6iocTkof/G448KlD9epQWqR/KFKD6tVB+/Tq6hP6d0Ed3FMHbRFr166dGZyh9DSqfjnSrhcXXXSRnHTSSdK3b99y3wvd8N5oow41KMSjsRGg0nN/6WojiYmJZmWBY4891swPtXDhQssLqIMPdaAGNVkHN0wZRR18+6+LD+i0YS+88IK5TVewql+/vnXDDTdYV199tVmYQC9vv/225VbUoeYRFiPM77//bo0YMaJkrkSd+0tXqNBlh3TCaa+gDj7UgRrYqIMPdbCsu+++24qLi7NeeeUVE5wfe+yxMiuxjB492jrppJNc/4WKOtQcwmIEmTZtmpWQkGBm1V+5cmWZ+/TNsGXLltaCBQsst6MOPtSBGtiog4/X61B6Mv1x48ZZMTExVuvWra1nnnmmzOM0KOlyfrrUqxtRh5pHWIywb8xnn322FR0dXfJNqPSpl8GDB5tmd3v9Z7eiDj7UgRrYqIMPdfjfqjRKl6rT16strTt27CjzuIsvvtgaOHCgq1ZrKo061CzCYphyWqtWlyLSfhYpKSnWmjVrDulnc8cdd7jqoKcOPtSBGtiogw91CKy/pa6NrkFJW89KB6ULL7zQLOXntlpQh9rBaOgwVHrU7ooVK8zoPB3Jp/MDqu3bt8s555xjpoKZNWuWtG3b9pCRW26YP5A6+FAHamCjDj7UoSz7tc2fP9+sVpWXl2dqoauQqHvvvVcee+wxufTSS81KJTr6+9VXX5UFCxa4aqJp6lCLaimEoga+LY8fP96M5NNLo0aNrNdee63kG9H27dtNv5zjjz/eyszMtNyGOvhQB2pgow4+1KH8lrT33nvPio+PN61kN910k9WqVSvrzDPPLHncgw8+aFrW2rVrZwZ6uK0m1KF2ERbDVHp6uhm9l5GRYX5OTU01HbefeOIJa+fOnSVvhtppV+9zK+rgQx2ogY06eLsO5Z1+37Bhg9WxY0frueeeMz//8ssv1hFHHGGNGjWqzGlZHR3cvHlzKycnx4p01CG4CIthYtGiRdaqVavMv1esWGH169fP+vDDD83Ps2bNsg477DDrggsuMN+I9M1Q3wRVdna2q/paUAcf6kANbNTBhzr8LyDpKF5tIbMDkA7Y0T6admDS1jSdFsY2Z86cMoOAIh11CD7CYhhYv369metpyJAh1rp166x9+/aZKSDy8/PNvGA63YP9TWnYsGFmslmdM6r0tyI3vBlSBx/qQA1s1MGHOvwvIH3//fdWnTp1rLFjx5apz2mnnWbCs7akakDS+SXVzz//bFpWlyxZ4oqJx6lDaBAWw8Rf//pX66yzzjJvdBs3biy5XZvPdbZ5exoA7YPRvXt38wfhxoOdOvhQB2pgow4+Xq6DHZC05UxXIbn33nvL3K+h+NRTTzVTBv35z38uc5+Gqd69e7uiJY06hM6hq60jqOzB6KNGjZI///nPkpWVJWPHjjVrmqpVq1ZJgwYNJCYmxvy8efNmee2118zoLR315ZbB7NTBhzpQAxt18KEOYkZ+r127Vk4++WTz2h955JGS1/XGG2/Ili1bZPLkyVKvXj2zFvb7778vCxculFtvvVWmTZsmL7zwQsBrpYcz6hBCIQyqOKD0t18dzdenTx/z7Vn73Dz//POmqf3yyy8335Y7depU0qzulm/NNurgQx2ogY06+Hi9DtqipiuR6GCNp59+uuT2hx56yGratKm1ePFi8/O8efNMy5oO/OncubNpXXXTBOTUIXSYZzFMlJ4D7PXXX5dXXnnFzA/1zDPPyOzZs2XevHly2GGHyXPPPWe+QbtpjrDSqIMPdaAGNurg4/U6aKvZE088If/5z3/kqquukpycHJk0aZJMnz5dBg0aVDL3ZHZ2trlPX3t8fLwkJCSIm1CHEAlhUMVBSn8LfvXVV03/iuHDh1tbt24t01/D/tbsVtTBhzpQAxt18PF6HbKyskyfzA4dOph+edqC5obBO5VFHYKPPothpHT/mquvvlpGjhxpvkXdeeedsmnTJvNtSe+Pjo4WN6MOPtSBGtiog4/X69CiRQu5//77ZeDAgdKpUydZtmyZuV1bz7Ql1SuoQ/ARFsP8zVCb2bUjd0ZGhngJdfChDtTARh18vF6H5s2by7hx4+SMM86Qd999Vx5//PGSoKSnYL2COgQXfRYjoH/O+eefb74p6xqnXkMdfKgDNbBRBx+v12Hr1q1mNLC2qp199tmSnp4uXkQdgoOWxQj49nzUUUdJ/fr1zVQAXkMdfKgDNbBRBx+v10FPxd53333Srl07WbRokfz3v/8VL6IOweHOjh0uejPcvn27fP/99zJlyhSJjY0N9S6FBHXwoQ7UwEYdfLxeBw1Kjz32mPn34YcfLl5FHWofp6EjwL59+8wko15HHXyoAzWwUQcf6gDULsIiAAAAHNFnEQAAAI4IiwAAAHBEWAQAAIAjwiIAAAAcERYBAADgiLAIAAAAR4RFAAAAOCIsAgAAwBFhEQAAAI4IiwAAABAn/w/tD90sQE1E5AAAAABJRU5ErkJggg=="
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "from mplfinance.original_flavor import candlestick2_ohlc\n",
    "import matplotlib.pyplot as plt\n",
    "import mplfinance as mpf\n",
    "df = pd.read_csv(file_name)\n",
    "df.columns = ['stock','date', 'close','open', 'high', 'low',  'volume']\n",
    "df['date'] = pd.to_datetime(df['date'])\n",
    "df = df.set_index('date')\n",
    "my_colors = mpf.make_marketcolors(up='r',down='g',wick='i',edge='k',volume={'up':'r','down':'g'},ohlc='i')\n",
    "my_style = mpf.make_mpf_style(marketcolors=my_colors, gridstyle='-',y_on_right=False)\n",
    "mpf.plot(df, type='candle', style=my_style, volume=True, title='price')"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2025-09-02T08:11:07.607349400Z",
     "start_time": "2025-09-02T08:11:07.451576Z"
    }
   },
   "id": "928f953b27e9a971"
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "outputs": [],
   "source": [],
   "metadata": {
    "collapsed": false
   },
   "id": "d124e0b90fc58bf8"
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
